<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        //变更函数调用者示例
        function foo() {
            console.log(this.name)
        }

        // 测试
        const obj = {
            name: '写代码像蔡徐抻'
        }

        Function.prototype.myCall = function (thisArg, ...args) {
            const fn = Symbol('fn')        // 声明一个独有的Symbol属性, 防止fn覆盖已有属性
            thisArg = thisArg || window    // 若没有传入this, 默认绑定window对象
            thisArg[fn] = this              // this指向调用call的对象,即我们要改变this指向的函数
            console.log('this', this);
            console.log('thisArg', thisArg);
            const result = thisArg[fn](...args)  // 执行当前函数
            delete thisArg[fn]              // 删除我们声明的fn属性
            return result                  // 返回函数执行结果
        }

        //测试
        foo.myCall(obj)     // 输出'写代码像蔡徐抻'

    </script>
</body>

</html>